home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Other Stuff / Other Stuff ’97 / PowerOS Development / basic kernel source / dprintf.c < prev    next >
C/C++ Source or Header  |  1997-06-26  |  2KB  |  102 lines

  1. /*
  2.     dprintf.c
  3.     a source file for PowerOS
  4.     copyright 1996-1997 by Ben Martz
  5.     all rights reserved world wide
  6.  
  7.     ANY AND ALL MODIFICATIONS TO THIS SOURCE MUST CREDIT THE ORIGINAL
  8.     AUTHOR, BEN MARTZ (benmartz@ic.net), AND MUST BE GIVEN TO THE AUTHOR
  9.     FOR INTEGRATION INTO THE MAIN PowerOS SOURCE TREE. THANK YOU FOR YOUR
  10.     COOPERATION!
  11. */
  12.  
  13.  
  14. #include "poweros_types.h"
  15. #include "debug_console.h"
  16. #include "dprintf.h"
  17. #include <stdarg.h>
  18.  
  19. void    dprintstr(char *s);
  20. void    dprintnum(unsigned int num, int base);
  21.  
  22. void dprintf(char *format, ...) {
  23.     __gnuc_va_list    args;
  24.     char    *pos, c, f;
  25.     int    num = 0, islong = 0;
  26.     char    *s;
  27.     u_long    unum = 0;
  28.  
  29.     va_start(args,format);
  30.  
  31.     pos = format;
  32.     while(c = *pos++) {
  33.         if(c == '%') {
  34.             f = *pos++;
  35.         switchagain:
  36.             switch(f) {
  37.                 case '%':
  38.                     cputchar('%');
  39.                     break;
  40.                 case 'c':
  41.                     num = va_arg(args,int);
  42.                     cputchar(num);
  43.                     break;
  44.                 case 's':
  45.                     s = va_arg(args,char *);
  46.                     dprintstr(s);
  47.                     break;
  48.                 case 'd':
  49.                     num = va_arg(args,int);
  50.                     if(num < 0) {
  51.                         num *= -1;
  52.                         cputchar('-');
  53.                     }
  54.                     dprintnum(num,10);
  55.                     break;
  56.                 case 'x':
  57.                     num = va_arg(args,int);
  58.                     dprintnum(num,16);
  59.                     break;
  60.                 case 'l':
  61.                     f = *pos++;
  62.                     goto switchagain;
  63.                     break;
  64.                 case 'u':
  65.                     unum = va_arg(args,int);
  66.                     dprintnum(num,10);
  67.                     break;
  68.             }
  69.         } else {
  70.             cputchar(c);
  71.         }
  72.     }
  73.     
  74.     va_end(args);
  75. }
  76.  
  77. void dprintstr(char *s) {
  78.     char    c;
  79.     
  80.     while(c = *s++) cputchar(c);
  81. }
  82.  
  83. const char num_chars[] = "0123456789abcdef";
  84.  
  85. void dprintnum(unsigned int num, int base) {
  86.     char    numbuf[16];
  87.     char    *tmp;
  88.     
  89.     if(num == 0) {
  90.         cputchar('0');
  91.         return;
  92.     }
  93.     
  94.     tmp = numbuf+15;
  95.     *tmp = '\0';
  96.     while(num > 0) {
  97.         *--tmp = num_chars[num % base];
  98.         num /= base;
  99.     }
  100.     dprintstr(tmp);
  101. }
  102.